package cn.tedu.charging.order.service.impl;

import cn.tedu.charging.order.pojo.dto.CarInfoDto;
import cn.tedu.charging.order.pojo.dto.ChargingDto;
import cn.tedu.charging.order.pojo.dto.StationInfoDto;
import cn.tedu.charging.order.pojo.param.OrderAddParam;
import cn.tedu.charging.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Random;

/**
 * 订单Service
 */
@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    /**
     * 创建订单
     * @param orderAddParam
     * @return
     */
    @Override
    public String createOrder(OrderAddParam orderAddParam) {
        //todo 订单创建的流程 自顶向下编程
        //1 创建订单编号
        String orderNo = getOrderNo();
        log.debug("生成订单号:{}",orderNo);
        //2 通过枪id获取运营商信息和充电桩信息
        log.debug("获取运营商和场站信息-入参:{}",orderAddParam.getGunId());
        StationInfoDto stationInfo = getStationInfo(orderAddParam.getGunId());
        log.debug("获取运营商和场站信息-入参:{},出参:{}",orderAddParam.getGunId(),stationInfo);
        //3 通过用户id获取用户车辆信息
        log.debug("获取用户车辆信息-入参:{}",orderAddParam.getUserId());
        CarInfoDto carInfo = getCarInfo(orderAddParam.getUserId());
        log.debug("获取用户车辆信息-入参:{},出参:{}",orderAddParam.getUserId(),carInfo);
        //4 通过枪id修改枪的状态为已使用
        // 2 表示为已经使用  就传2
        log.debug("设置充电枪状态为已经使用-入参:枪id-{},状态-{}",orderAddParam.getUserId(),2);
        Boolean success = updateGunStatus(orderAddParam.getGunId(),2);
        log.debug("设置充电枪状态为已经使用-入参:枪id-{},状态-{},出参:{}",orderAddParam.getUserId(),2,success);
        if(!success) {
            log.warn("修改枪状态失败!,枪id:{},状态:{}",orderAddParam.getGunId(),2);
        }
        //5 给充电桩发送充电指令
        ChargingDto chargingDto =new ChargingDto();
        chargingDto.setOrderNo(orderNo);
        chargingDto.setGunId(orderAddParam.getGunId());
        chargingDto.setPileId(orderAddParam.getPileId());
        chargingDto.setMsg("start");
        startCharging(chargingDto);
        return orderNo;
    }



    /**
     * 生成订单号
     * 10000 + "_" + 随机数 + "_" + 时间戳
     * @return String
     */
    private String getOrderNo(){
        //换一种算法 雪花算法自己了解   分布式id生成器
        String start = "10000";
        long now = System.currentTimeMillis();
        Random random = new Random();
        int r = random.nextInt(100);
        String orderNo = start + "_" +  r  + "_" + now;
        return orderNo;
    }

    /**
     * 通过枪id获取运营商信息和充电站信息
     * @param gunId
     * @return StationInfoDto
     */
    private StationInfoDto getStationInfo(Integer gunId) {
        StationInfoDto stationInfoDto = new StationInfoDto();
        stationInfoDto.setStationId(1);
        stationInfoDto.setOperatorId(1);
        return stationInfoDto;
    }

    /**
     * 通过用户id获取用户绑定的车辆信息
     * 先假定一个用户只能绑定一个车辆,充电的时候用户绑定的那辆唯一的车
     * 如果后续功能迭代, 充电的时候有用户选择给哪辆车充电,车的id可以通过入参的方式传入
     * @param userId
     * @return
     */
    private CarInfoDto getCarInfo(Integer userId){
        CarInfoDto carInfoDto = new CarInfoDto();
        carInfoDto.setCarId(1);
        return carInfoDto;
    }

    /**
     * 修改充电枪的状态
     * @param gunId 枪id
     * @param gunStatsBusy 枪状态
     * @return
     */
    private Boolean updateGunStatus(Integer gunId,Integer gunStatsBusy){
        return true;
    }

    /**
     * 异步下发充电指令给充电桩
     * @param chargingDto
     */
    private void startCharging(ChargingDto chargingDto) {
        log.debug("发送指令:{}",chargingDto);
    }
}
